#include "utils.h"
#include <ncurses.h>
#include <wchar.h>
#include <locale.h>

// 打印  输入  界面
int Login_menu_1(int selected, const wchar_t *menu_items[], int num_items, const wchar_t *title, int title_size)
{
    int ch;
    selected = 0;

    setlocale(LC_ALL, "");
    // setlocale(LC_ALL, "zh_CN.UTF-8"); // 设置locale以支持宽字符

    initscr();                             // 初始化屏幕
    cbreak();                              // 禁用行缓冲
    noecho();                              // 不回显输入的字符
    keypad(stdscr, TRUE);                  // 启用键盘映射
    start_color();                         // 如果需要颜色支持，则调用此函数
    init_pair(1, COLOR_BLACK, COLOR_CYAN); // 初始化颜色对   背景COLOR_WHITE
    init_pair(2, COLOR_CYAN, COLOR_MAGENTA);
    init_pair(3, COLOR_WHITE, COLOR_CYAN);
    init_pair(4, COLOR_WHITE, COLOR_RED);
    // 假设我们想要一个带有边框的窗口
    WINDOW *win = newwin(LINES, COLS, 0, 0);
    box(win, 0, 0); // 绘制边框

    wrefresh(win); // 刷新窗口以显示边框
    int start_y = 6;

    while (1)
    {
        werase(win);
        wbkgd(win, COLOR_PAIR(1));
        box(win, 0, 0); // 绘制边框

        wrefresh(win); // 刷新窗口以显示边框
        for (size_t i = 0; i < COLS-2; i++)
        {
            mvwprintw(win, start_y - 2, i+1, "-");
            mvwprintw(win, start_y + 2, i+1, "-");
        }
        wmove(win, start_y, 60);

        wattron(win, COLOR_PAIR(2));
        wprintw(win, "%ls", title);
        wattroff(win, COLOR_PAIR(2));
        // //  werase(win);           // 清除屏幕
        for (int i = 0; i < num_items; i++)
        {

            wmove(win, i + start_y + 5, 77); // 移动光标到正确的位置

            if (i == selected)
            {

                // wattron(win, A_REVERSE); // 反转颜色以显示光标
                wattron(win, COLOR_PAIR(4));
                wprintw(win, "%ls", menu_items[i]);
                wattroff(win, COLOR_PAIR(4));
                // wattroff(win, A_REVERSE);
            }
            else
            {
                wattron(win, COLOR_PAIR(3));
                wprintw(win, "%ls", menu_items[i]);
                wattroff(win, COLOR_PAIR(3));
            }
        }

        // wrefresh(win);

        ch = wgetch(win); // 在窗口内等待用户输入

        refresh(); // 刷新
        switch (ch)
        {
        case 119:
            if (selected > 0)
            {
                selected--;
            }
            break;
        case 115:
            if (selected < num_items - 1)
            {
                selected++;
            }
            break;
        case '\n': // 回车键
            wattron(win, COLOR_PAIR(4));
            wprintw(win, "\n您选择了：%ls\n", menu_items[selected]);
            wattroff(win, COLOR_PAIR(4));
            wrefresh(win);
            sleep(1); // 睡眠0.5秒，以便在退出前查看选择
            endwin(); // 退出ncurses模式
            return selected;
        }
    }
}

user_t user_info(void)
{

    user_t userinfo = {.account = "0", .passwd = "0", .phone = "0", .sex = "0", .name = "0", .status = 0};
    text_center("请输入账号：", RED);
    scanf("%s", userinfo.account);
    center_char("请输入密码：", RED);
    scanf(" %s", userinfo.passwd);

    return userinfo;
}

//////////////////////////////////////////////////////////////////////////////////////////

// 校验注册信息
user_t checkout(user_t user_data)
{

    char flag = '0';
    char pas1[11], pas2[11];
    while (1)
    {
        int len = strlen(user_data.name);
        if (len > 15 || len % 3 != 0)
        {

            center_char("您的昵称设置超出规定长度，请重新设置\n", GREEN);
            center_char("请设置您的姓名，长度为15个字符以内：", GREEN);
            scanf("%s", user_data.name);
            continue;
        }

        if (strlen(user_data.account) > 10)
        {
            center_char("您的账号设置超出规定长度，请重新设置\n", GREEN);
            center_char("请设置您的账号account，最长长度为10个字符：", GREEN);
            scanf("%s", user_data.account);
            continue;
        }

        if (strlen(user_data.passwd) > 10)
        {
            center_char("您的账号密码设置超出规定长度，请重新设置\n", GREEN);
            center_char("请设置您的账号密码，最长长度为10个字符：", GREEN);

            while (1)
            {

                scanf("%s", pas1);
                center_char("请重新输入密码：", GREEN);
                scanf("%s", pas2);
                if (!strcmp(pas1, pas2))
                {

                    break;
                }
                else
                {
                    center_char("您的两次密码不一致，请重新输入", GREEN);
                }
            }
            strcpy(user_data.passwd, pas1);
            continue;
        }

        if (!strcmp(user_data.sex, "男"))
            flag = '1';
        if (!strcmp(user_data.sex, "女"))
            flag = '1';
        if (flag == '0')
        {
            center_char("您的性别设置有误，请重新输入:\n", GREEN);
            center_char("请选择您的性别：男 or 女 :", GREEN);
            scanf("%s", user_data.sex);
            continue;
        }
        break;

        if (strlen(user_data.phone) > 11)
        {
            center_char("您的手机号码设置有误，请重新输入:\n", GREEN);
            scanf("%s", user_data.phone);
            continue;
        }

        break;
    }

    return user_data;
}

// 注册
user_t sign_in(void)
{
    user_t user_info;
    char pas1[11], pas2[11];
    char temp;
    system("clear");
    while (1)
    {
        text_center("请设置您的姓名,为2~3个的汉字:", GREEN);

        scanf("%s", user_info.name);
        center_char("请设置您的账号account,最长长度为10个字符:", GREEN);
        scanf("%s", user_info.account);
        while (1)
        {
            center_char("请设置密码：", GREEN);

            scanf("%s", pas1);
            center_char("请重新输入密码：", GREEN);

            scanf("%s", pas2);
            if (strcmp(pas1, pas2))
            {

                center_char("您的两次密码不一致，请重新输入\n", GREEN);

                continue;
            }
            else
            {
                break;
            }
        }

        strcpy(user_info.passwd, pas1);

        center_char("请选择您的性别(男 or 女):", GREEN);
        scanf("%s", user_info.sex);
        center_char("请输入您的手机号码:", GREEN);
        scanf("%s", user_info.phone);
        user_info.status = 0;

        text_center("请核对您输入的信息\n", GREEN);

  
        char tempstr[64];

        memset(&tempstr , 0 , sizeof(tempstr));
        sprintf(tempstr , "name:%s\n" ,user_info.name );
        center_char(tempstr, GREEN);

        memset(&tempstr , 0 , sizeof(tempstr));
        sprintf(tempstr , "account:%s\n" ,user_info.account );    
        center_char(tempstr, GREEN);
 
        memset(&tempstr , 0 , sizeof(tempstr));
        sprintf(tempstr , "passwd:%s\n" ,user_info.passwd ); 
        center_char(tempstr, GREEN);
      
        memset(&tempstr , 0 , sizeof(tempstr));
        sprintf(tempstr , "性别:%s\n" ,user_info.sex ); 
        center_char(tempstr, GREEN);
    
        memset(&tempstr , 0 , sizeof(tempstr));
        sprintf(tempstr , "手机号:%s\n" ,user_info.phone ); 
        center_char(tempstr, GREEN);
     
        memset(&tempstr , 0 , sizeof(tempstr));
        sprintf(tempstr , "会员等级:%d\n" ,user_info.status );      
        center_char(tempstr, GREEN);
      
        center_char("如果确认输入信息无误，若无误请按Y/y结束，需要重新修改请按其他键", GREEN);
        scanf(" %c", &temp);
        if (temp == 'Y' || temp == 'y')
        {
            user_info = checkout(user_info);
            return user_info;
        }
    }
}

//////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////
// 输出界面
void center_char(char *text, const char *color)
{

    // 假设的终端宽度
    int terminalWidth = 175;
    // 计算字符串长度
    int messageLength = strlen(text);

    // 计算需要填充的空格数，然后除以2，得到左边空格数
    int spaces = (terminalWidth - messageLength) / 2;

    for (int i = 0; i < spaces; i++)
    {
        printf(" ");
    }
    printf("%s", color);
    // 打印消息
    printf("%s", text);

    // 重置颜色
    printf("%s", RESET);
    fflush(stdout);
    return;
}

// 终端居中输出文本
void text_center(char *text, const char *color)
{
    system("clear");
    // 假设的终端宽度
    int terminalWidth = 175;
    // 计算字符串长度
    int messageLength = strlen(text);
    int title_size = strlen("你孤独吗？这里有一群热情、团结的朋友等着你");
    // 计算需要填充的空格数，然后除以2，得到左边空格数
    int spaces = (terminalWidth - messageLength) / 2;
    int title = (terminalWidth - title_size) / 2;
    printf("\n\n");
    for (size_t i = 0; i < terminalWidth; i++)
    {
        printf("-");
    }
    // 打印左侧空格
    printf("\n\n");
    for (int i = 0; i < title + 5; i++)
    {
        printf(" ");
    }
    printf("你孤独吗？这里有一群热情、团结的朋友等着你\n");
    printf("\n");
    for (size_t i = 0; i < terminalWidth; i++)
    {
        printf("-");
    }
    puts(" ");
    // 打印颜色

    printf("%s", color);
    for (int i = 0; i < spaces; i++)
    {
        printf(" ");
    }
    // 打印消息
    printf("%s", text);

    // 重置颜色
    printf("%s", RESET);

    return;
}